/*
 * 本模块用于上报失联硬件
 * 首先INIT_DOG(unsigned long feedTime[8])可以赋值报警阈值，一旦超过该值没有喂狗，可以通过DOG_CODE()查询的故障码。
 * 在设定时间内DOG_FEED(uint8_t channel)，可以解除警报。
 * 最多可以监控8个通道的失联。
 */
#include "DOG.h"

uint8_t dogWoofTime[8];
uint8_t dogCode;
unsigned long lastFeedTime[8];

void INIT_DOG(unsigned long feedTime[8])
{
  for(uint8_t i = 0; i < 8; i ++)
  {
    dogWoofTime[i] = feedTime[i];
  }
}

void DOG_FEED(uint8_t channel)
{
  dogCode &= ~(1 << channel);
  lastFeedTime[channel] = millis();
}

uint8_t DOG_CODE(void)
{
  for (uint8_t i = 0; i <= 7; i ++)
  {
    if (millis() - lastFeedTime[i] > dogWoofTime[i])
    {
      // 超时，将相应的通道故障位置1
      dogCode |= (1 << i);
    }
  }
  return dogCode;
}
